from django.utils import timezone
from django.core.validators import MinLengthValidator, MaxLengthValidator, RegexValidator, MinValueValidator
from django.db import models


class Register(models.Model):
    ROLE_CHOICES = [
        (1, "teacher"),
        (0, "student")
    ]
    no = models.CharField(
        max_length=10,
        primary_key=True,
        verbose_name='学号/工号',
        unique=True,
        validators=[RegexValidator(regex=r'^[1-9]\d{9}$', message='学号/工号必须是不以0开头的10位数字')]
    )
    username = models.CharField(
        max_length=25,
        verbose_name='用户名',
        validators=[
            RegexValidator(regex=r'^[a-zA-Z_][a-zA-Z0-9_]*$', message='姓名只能包含字母、数字、下划线，且不能以数字开头。'),
            MaxLengthValidator(25, message='姓名不能超过25个字符')
        ]
    )
    password = models.CharField(
        max_length=25,
        verbose_name='密码',
        validators=[
            RegexValidator(regex=r'^[a-zA-Z0-9_]*$', message='密码只能包含字母、数字、下划线'),
            MinLengthValidator(6, message='密码长度必须在6到20个字符之间'),
            MaxLengthValidator(20, message='密码长度必须在6到20个字符之间')
        ]
    )
    tel = models.CharField(
        max_length=11,
        verbose_name='电话',
        validators=[RegexValidator(regex=r'^1\d{10}$', message='电话必须是1开头的11位数字')]
    )
    role = models.IntegerField(default=0, verbose_name='身份', choices=ROLE_CHOICES)


class Student(models.Model):
    sno = models.CharField(
        max_length=10,
        primary_key=True,
        verbose_name='学号/工号',
        unique=True,
        validators=[RegexValidator(regex=r'^[1-9]\d{9}$', message='学号/工号必须是不以0开头的10位数字')]
    )
    name = models.CharField(
        max_length=25,
        verbose_name='姓名',
        validators=[
            MaxLengthValidator(25, message='姓名不能超过25个字符'),
            RegexValidator(
                regex=r'^[\u4e00-\u9fa5a-zA-Z]+$',
                message='姓名只能包含汉字和英文字母',
                code='invalid_name'
            )
        ]
    )
    DEPARTMENT_CHOICES = [
        ("航空学院", "航空学院"),
        ("航天学院", "航天学院"),
        ("航海学院", "航海学院"),
        ("材料学院", "材料学院"),
        ("机电学院", "机电学院"),
        ("力学与土木建筑学院", "力学与土木建筑学院"),
        ("动力与能源学院", "动力与能源学院"),
        ("电子信息学院", "电子信息学院"),
        ("自动化学院", "自动化学院"),
        ("计算机学院", "计算机学院"),
        ("数学与统计学院", "数学与统计学院"),
        ("物理科学与技术学院", "物理科学与技术学院"),
        ("化学与化工学院", "化学与化工学院"),
        ("管理学院", "管理学院"),
        ("公共政策与管理学院", "公共政策与管理学院"),
        ("软件学院", "软件学院"),
        ("生命学院", "生命学院"),
        ("外国语学院", "外国语学院"),
        ("教育实验学院", "教育实验学院"),
        ("国际教育学院", "国际教育学院"),
        ("国家保密学院", "国家保密学院"),
        ("马克思主义学院", "马克思主义学院"),
        ("西北工业大学伦敦玛丽女王大学工程学院", "西北工业大学伦敦玛丽女王大学工程学院"),
        ("微电子学院", "微电子学院"),
        ("网络空间安全学院", "网络空间安全学院"),
        ("民航学院", "民航学院"),
        ("生态环境学院", "生态环境学院"),
        ("国家卓越工程师学院", "国家卓越工程师学院"),
    ]

    GRADE_CHOICES = [
        (1, '1'),
        (2, '2'),
        (3, '3'),
        (4, '4'),
    ]
    sgrade = models.IntegerField(verbose_name='年级', choices=GRADE_CHOICES)
    department = models.CharField(max_length=50, verbose_name="学院", choices=DEPARTMENT_CHOICES)


class Teacher(models.Model):
    tno = models.CharField(max_length=10, primary_key=True, verbose_name='工号', unique=True, validators=[
        RegexValidator(
            regex=r'^[1-9]/d{9}$', message='工号是不以0开头的十位数字',
        )
    ])
    tname = models.CharField(max_length=30, verbose_name='姓名', validators=[
        MaxLengthValidator(25, message='姓名不能超过25个字符'),
        RegexValidator(
            regex=r'^[\u4e00-\u9fa5a-zA-Z]+$',
            message='姓名只能包含汉字和英文字母',
            code='invalid_name'
        )
    ])
    department = models.CharField(max_length=45, verbose_name='学院')


class Test_ddl(models.Model):
    cno = models.IntegerField(verbose_name='课程号')
    test_time = models.DateField(
        verbose_name='考试时间',
        validators=[MinValueValidator(limit_value=timezone.now().date(), message='考试时间不能早于当前时间')]
    )
    test_place = models.CharField(
        max_length=45,
        verbose_name='考试地点',
        validators=[RegexValidator(
            regex=r'^教(西|东)(A|B|C|D)\d{3}$',
            message='考试地点格式不正确，示例：教西A202'
        )]
    )


class Homework_ddl(models.Model):
    cno = models.IntegerField(verbose_name='课程号')
    workno = models.CharField(verbose_name='作业名', max_length=25, validators=[
        MaxLengthValidator(25, message='姓名不能超过25个字符'),
        RegexValidator(
            regex=r'^[\u4e00-\u9fa5a-zA-Z0-9]+$',
            message='作业名只能包含汉字和英文字母',
            code='invalid_name'
        )
    ])
    homework_time = models.DateField(verbose_name='作业提交时间', validators=[
        MinValueValidator(limit_value=timezone.now().date(), message='作业提交时间不能早于当前时间')])
    plateform = models.CharField(max_length=25, verbose_name='提交平台', validators=[
        MaxLengthValidator(25, message='平台信息不能超过25个字符'),
        RegexValidator(
            regex=r'^[\u4e00-\u9fa5a-zA-Z0-9]+$',
            message='平台信息只能包含汉字和英文字母',
            code='invalid_name'
        )
    ])


class Stu_Cour(models.Model):
    id = models.BigAutoField(primary_key=True)
    cno = models.IntegerField(verbose_name='课程号')
    sno = models.CharField(max_length=10, verbose_name='学号', validators=[
        RegexValidator(
            regex=r'^[1-9]/d{9}$', message='学号号是不以0开头的十位数字',
        )
    ])


class Tea_Cour(models.Model):
    cno = models.BigAutoField(primary_key=True, verbose_name='课程号')
    cname = models.CharField(max_length=20, verbose_name='课程名', validators=[
        MaxLengthValidator(25, message='课程名不能超过25个字符'),
        RegexValidator(
            regex=r'^[\u4e00-\u9fa5a-zA-Z0-9]+$',
            message='课程名只能包含汉字和英文字母',
            code='invalid_name'
        )
    ])
    tno = models.CharField(max_length=10, verbose_name='工号', validators=[
        RegexValidator(
            regex=r'^[1-9]/d{9}$', message='课程号是不以0开头的十位数字',
        )
    ])
